import {
	isArray,
	isEmpty
} from "../utils/index.js";
import CommonPageMixin from "./common-page-mixin.js";
const DEFAULT_PAGE_INDEX = 1;
const DEFAULT_PAGE_SIZE = 30;
const LOAD_MORE_STATUS = {
	MORE: "MORE",
	LOADING: "LOADING",
	NO_MORE: "NO_MORE"
}
var CommonPageListMixin = {
	mixins: [CommonPageMixin],
	data() {
		return {
			// 默认页码索引
			pageIndex: DEFAULT_PAGE_INDEX,
			// 默认每页显示条数
			pageSize: DEFAULT_PAGE_SIZE,

			// 总计值，初始为0
			total: 0,
			// 数据源数组，初始为空数组
			sources: [],

			// 用于 uni-load-more 组件
			loadMoreStatus: LOAD_MORE_STATUS.NO_MORE, // 加载更多状态
			loadMoreContent: {
				contentdown: "上拉加载更多",
				contentrefresh: "更多数据加载中",
				contentnomore: "已经加载到底了"
			}, // 加载更多状态文本

			isRefreshing: false, // 是否刷新中
		}
	},
	computed: {
		/**
		 * 检查数据是否为空
		 * @return {boolean} 如果数据源为空则返回true，否则返回false
		 */
		dataEmpty: function() {
			return isEmpty(this.sources);
		},
		/**
		 * 检查是否可以加载更多数据
		 * @return {boolean} 当加载状态为MORE时返回true，表示可以加载更多
		 */
		canLoadMore: function() {
			return this.loadMoreStatus == LOAD_MORE_STATUS.MORE;
		},
		/**
		 * 检查是否正在加载更多数据
		 * @return {boolean} 当加载状态为LOADING时返回true，表示正在加载中
		 */
		isLoadingMore: function() {
			return this.loadMoreStatus == LOAD_MORE_STATUS.LOADING;
		},

		/**
		 * 检查是否有加载操作正在进行中
		 * @returns {boolean} - 如果正在加载更多数据或刷新数据，则返回true，否则返回false
		 */
		isLoadPending: function() {
			return this.isLoadingMore || this.isRefreshing;
		}
	},
	onPullDownRefresh() {
		// 判断是否正在加载更多或正在刷新
		// 如果是，则停止下拉刷新并直接返回
		if (this.isLoadingMore || this.isRefreshing) {
			uni.stopPullDownRefresh();
			return;
		}
		// 重置页码为默认页码
		this.pageIndex = DEFAULT_PAGE_INDEX;
		// 执行列表刷新操作，并在完成时停止下拉刷新
		this.refreshList().finally(() => {
			uni.stopPullDownRefresh();
		});
	},
	onReachBottom() {
		// 检查当前是否满足加载更多数据的条件
		// 如果正在加载更多数据、正在刷新数据或已经没有更多数据可加载，则直接返回
		if (this.isLoadingMore || this.isRefreshing || !this.canLoadMore) {
			return;
		}
		// 设置加载更多状态为"加载中"
		this.loadMoreStatus = LOAD_MORE_STATUS.LOADING;
		this.loadMoreList()
	},
	methods: {
		/**
		 * 请求列表数据的方法
		 * need reload function
		 * @returns {Promise} 返回一个Promise对象，目前直接解析为空数组[]
		 */
		requestListData() {
			// 目前直接返回一个解析为空数组的Promise
			// 在实际应用中，这里应该是发送网络请求获取数据的代码
			return Promise.resolve([]);
		},
		/**
		 * 刷新列表数据的方法
		 * 重置页码并重新请求数据
		 * @returns {Promise} 返回一个Promise对象，用于处理请求结果
		 */
		refreshList() {
			// 重置页码为默认值
			this.pageIndex = DEFAULT_PAGE_INDEX;
			// 设置刷新状态为true，表示正在刷新
			this.isRefreshing = true;
			// 调用请求数据的方法，并处理返回的结果
			return this.requestListData().then(res => {
				// 请求成功时的处理
				this.requestSuccess(res);
			}).catch((err) => {
				// 请求失败时的处理
				this.requestFail(err);
			}).finally(() => {
				// 无论请求成功或失败，最终都会执行的操作
				this.isRefreshing = false; // 刷新状态重置为false
			})
		},
		/**
		 * 加载更多列表数据的方法
		 * 该方法会设置加载状态为加载中，然后请求数据并根据请求结果处理成功或失败的情况
		 * @returns {Promise} 返回一个Promise对象，用于处理请求结果
		 */
		loadMoreList() {
			// 设置加载状态为"加载中"
			this.loadMoreStatus = LOAD_MORE_STATUS.LOADING;

			// 调用请求列表数据的方法，并使用Promise处理响应结果
			return this.requestListData().then(res => {
				// 如果请求成功，调用成功处理方法
				this.requestSuccess(res);
			}).catch((err) => {
				// 如果请求失败，调用失败处理方法
				this.requestFail(err);
			})
		},
		/**
		 * 处理请求成功后的数据
		 * @param {Object|Array} res - API返回的数据，可以是数组或包含records和total属性的对象
		 */
		requestSuccess(res) {
			// 定义结果数组和总数变量
			let result;
			let total;

			// 判断响应数据类型
			if (isArray(res)) {
				// 如果是数组，直接使用响应数据作为结果
				result = res;
				// 数组类型没有总数信息，设为-1表示未知
				total = -1;
			} else {
				// 如果是对象，使用records属性作为结果数组
				result = res.records;
				// 使用total属性作为总数
				total = res.total;
			}

			// 更新总数
			this.total = total;

			// 根据当前页码决定是初始化数据还是追加数据
			if (this.pageIndex == DEFAULT_PAGE_INDEX) {
				// 如果是第一页，直接替换数据源
				this.sources = result;
			} else {
				// 如果是后续页，将新数据追加到现有数据源
				this.sources = this.sources.concat(result);
			}

			// 根据返回结果长度判断是否还有更多数据
			if (result.length == this.pageSize) {
				// 返回结果长度等于每页大小，表示还有更多数据
				this.loadMoreStatus = LOAD_MORE_STATUS.MORE;
				// 页码递增，为下一次请求做准备
				this.pageIndex++;
			} else if (result.length < this.pageSize) {
				// 返回结果长度小于每页大小，表示没有更多数据了
				this.loadMoreStatus = LOAD_MORE_STATUS.NO_MORE;
			} else {
				// 返回结果长度大于每页大小，异常情况，抛出错误
				this.loadMoreStatus = LOAD_MORE_STATUS.MORE;
				throw new Error('result length should not bigger then pageSize');
			}

			// 隐藏加载提示
			uni.hideLoading();
		},
		/**
		 * 处理请求失败的情况
		 * @param {Error|string} err - 错误对象或错误信息
		 */
		requestFail(err) {
			// 设置加载状态为"可以加载更多"，允许用户重试
			this.loadMoreStatus = LOAD_MORE_STATUS.MORE;

			// 显示错误提示信息
			// 使用_showToastPromise方法显示错误提示，第二个参数true表示这是一个错误提示
			this._showToastPromise({
				title: err // 显示错误信息
			}, true)
		}
	}
}

module.exports = CommonPageListMixin;